/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gui;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import logic.BDManage;

/**
 * Clase GUI  encargada de administrar el entonrno gráfico de la aplicación.
 * @author Victoria Fuenmayor y José Gabriel Rivera
 */
public class GUI extends javax.swing.JFrame {

    private PanelBoletos panelBoletos;
    private JPanelInfoRifa panelInfoRifa;
    private JPanelInfoCliente panelInfoCliente;
    private JPanelCategoria listaCat;
    private JPanelRifa listaRifa;
    private BDManage categoria;
    private BDManage cliente;
    private JFrameGuardado windowGuardar;
    private JFrameCategoria windowAnadirCat;
    private JFrameRifa windowAnadirRifa;
    private JFrameCompra windowBotonCompra;
    private JFramePago windowBotonPagar;
    private JFrameBorrarCat windowBorrarCat;
    private JFrameBorrarRifa windowBorrarRifa;
    private JFrameSorteo windowSorteo;
    
    /**
     * Recibe el título que se colocará en el marco del JFrame.
     * Coloca el fondo de la ventana principal.
     * Carga las Base de datos cliente y categoría (en caso de existir), sino las crea.
     * Crea todos los paneles con sus especificaciones (lista de categoria, lista de rifas, panel de boletos)
     * (panel de la información de la rifa, información del cliente, botones de compra, copiado y pago de un boleto)
     * @param titulo 
     */
    public GUI(String titulo) {
        this.setTitle(titulo);
        this.setContentPane(new FondoJPanel("/imagenes/interfazRifa.png"));
        
        initComponents();
        
        cargarBD();

        if ((categoria == null) || cliente == null){
            categoria =  new BDManage();
            cliente = new BDManage();
        }

        this.setLayout(null);
        
        listaCat = new JPanelCategoria(categoria,this);
        this.add(listaCat);
        listaCat.setBounds(10, 45, 200, 22);
        listaCat.setVisible(true);
        
        listaRifa = new JPanelRifa(categoria, this);
        this.add(listaRifa);
        listaRifa.setBounds(250, 45, 200, 22);
        listaRifa.setVisible(false);
                
        panelBoletos = new PanelBoletos(this);
        this.add(panelBoletos);
        panelBoletos.setBounds(10, 250, 500, 300);
        panelBoletos.setVisible(false);
        panelBoletos.setBorder(javax.swing.BorderFactory.createTitledBorder("Boletos:"));
        
        panelInfoRifa = new JPanelInfoRifa();
        this.add(panelInfoRifa);
        panelInfoRifa.setBounds(520, 45, 265, 375);
        panelInfoRifa.setVisible(false);
        panelInfoRifa.setBorder(javax.swing.BorderFactory.createTitledBorder("INFO DE LA RIFA"));
        
        panelInfoCliente = new JPanelInfoCliente();
        this.add(panelInfoCliente);
        panelInfoCliente.setBounds(520, 435, 265, 185);
        panelInfoCliente.setVisible(false);
        panelInfoCliente.setBorder(javax.swing.BorderFactory.createTitledBorder("INFO DEL CLIENTE"));        
        
        jButtonComprar.setVisible(false);
        botonPagar.setVisible(false);
        copiarCliente.setVisible(false);
        
        this.setVisible(true);
        
    } 
    
    /**
     * Retorna el botón (gráfico) de copiar cliente.
     * @return boton (tipo JButton)
     */
    public JButton getCopiarCliente(){
        return copiarCliente;
    }
    
    /**
     * Retorna el Panel en donde están los boletos creados.
     * @return panel (tipo PanelBoletos)
     */
    public PanelBoletos getPanelBoletos() {
        return panelBoletos;
    }

    /**
     * Retorna el panel de la información de la rifa.
     * @return panel (Tipo JPanelInfoRifa)
     */
    public JPanelInfoRifa getPanelInfoRifa() {
        return panelInfoRifa;
    }

    /**
     * Retorna el panel de la información del cliente.
     * @return panel (tipo JPanelInfoCliente)
     */
    public JPanelInfoCliente getPanelInfoCliente() {
        return panelInfoCliente;
    }

    /**
     * Retorna el Choice de las listas agregadas.
     * @return lista de categorias (tipo JPanelCategoria)
     */
    public JPanelCategoria getListaCat() {
        return listaCat;
    }

    /**
     * Retorna el panel donde se encuentra el Choice de la rifa.
     * @return panel (Tipo JPanelRifa)
     */
    public JPanelRifa getListaRifa() {
        return listaRifa;
    }

    /**
     * Retorna el boton (grafico) de pagar
     * @return boton (Tipo JButton)
     */
    public JButton getBotonPagar() {
        return botonPagar;
    }

    /**
     * Retorna el boton (gráfico) de compra.
     * @return boton (Tipo JButton)
     */
    public JButton getjButtonComprar() {
        return jButtonComprar;
    }

    /**
     * Retorna el objeto del tipo BDManage (Base de datos de categorias)
     * @return categoria (Tipo BDManage)
     */
    public BDManage getCategoria() {
        return categoria;
    }

    /**
     * Retorna el objeto del tipo BDManage (Base de datos de cliente)
     * @return cliente (Tipo BDManage)
     */    
    public BDManage getCliente() {
        return cliente;
    }
    
    /**
     * Carga la Base de datos de categoria y cliente en los archivos. 
     */
    public void cargarBD(){
        categoria = logic.Guardar.abrir("BDCategorias", windowGuardar);
        cliente = logic.Guardar.abrir("BDClientes", windowGuardar);
    }

    /**
     * Guarda la Base de datos de categoria y cliente en los archivos. 
     */
    public void guardarBD(){
        logic.Guardar.guardar(categoria, "BDCategorias", windowGuardar);
        logic.Guardar.guardar(cliente, "BDClientes", windowGuardar);
    }
    
    /**
     * Borra lor archivos de Base de datos de categoria y cliente. (Generando nuevos y cargandolos) 
     */    
    public void borrarBD(){
        categoria = new BDManage();
        cliente = new BDManage();
        guardarBD();
        listaCat.CargarCat();
    }
      
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jButtonComprar = new javax.swing.JButton();
        botonPagar = new javax.swing.JButton();
        copiarCliente = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItemGuardado = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItemAñadirCategoria = new javax.swing.JMenuItem();
        jMenuItemAñadirRifa = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        jMenuItemBorrarCat = new javax.swing.JMenuItem();
        botonBorrarRifa = new javax.swing.JMenuItem();
        jMenu4 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(500, 500));
        setResizable(false);

        jButtonComprar.setText("Comprar");
        jButtonComprar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonComprarMouseClicked(evt);
            }
        });

        botonPagar.setText("Pagar");
        botonPagar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                botonPagarMouseClicked(evt);
            }
        });

        copiarCliente.setText("Copiar cliente");
        copiarCliente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                copiarClienteActionPerformed(evt);
            }
        });

        jMenu1.setText("Archivo");

        jMenuItemGuardado.setText("Opciones de Guardado");
        jMenuItemGuardado.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemGuardadoActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItemGuardado);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Añadir");

        jMenuItemAñadirCategoria.setText("Categoría");
        jMenuItemAñadirCategoria.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemAñadirCategoriaActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItemAñadirCategoria);

        jMenuItemAñadirRifa.setText("Rifa");
        jMenuItemAñadirRifa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemAñadirRifaActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItemAñadirRifa);

        jMenuBar1.add(jMenu2);

        jMenu3.setText("Borrar");

        jMenuItemBorrarCat.setText("Categoría");
        jMenuItemBorrarCat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemBorrarCatActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItemBorrarCat);

        botonBorrarRifa.setText("Rifa");
        botonBorrarRifa.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonBorrarRifaActionPerformed(evt);
            }
        });
        jMenu3.add(botonBorrarRifa);

        jMenuBar1.add(jMenu3);

        jMenu4.setText("Sorteos");

        jMenuItem1.setText("Realizar sorteo");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu4.add(jMenuItem1);

        jMenuBar1.add(jMenu4);

        setJMenuBar(jMenuBar1);
        jMenuBar1.getAccessibleContext().setAccessibleParent(this);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButtonComprar, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(copiarCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(botonPagar, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(299, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(562, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonComprar, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonPagar, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(copiarCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(32, 32, 32))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Al presionar el boton Añadir categoria, crea el nuevo Jframe y lo hace visible.
     * @param evt 
     */
    private void jMenuItemAñadirCategoriaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemAñadirCategoriaActionPerformed
        // TODO add your handling code here:
        windowAnadirCat = new JFrameCategoria(this);
        windowAnadirCat.setVisible(true);
    }//GEN-LAST:event_jMenuItemAñadirCategoriaActionPerformed

    /**
     * Al presionar el boton de añadir rifa se crea un nuevo JFrame en caso de que existan categorias creadas.
     * @param evt 
     */
    private void jMenuItemAñadirRifaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemAñadirRifaActionPerformed
        // TODO add your handling code here:
        windowAnadirRifa = new JFrameRifa(this);
        if (listaCat.getNroCategorias()>0){
            windowAnadirRifa.setVisible(true);    
        }else{
            JOptionPane.showMessageDialog(this, "Error: Debe crear una categoría");
            windowAnadirRifa.setVisible(false);
        }
        
    }//GEN-LAST:event_jMenuItemAñadirRifaActionPerformed

    /**
     * Mouseclicked para el boton de Compra.
     * Verifica que la rifa no haya sifo sorteada para así poder comprar boletos.
     * Crea un nuevo frame de la ventana compra, verifica los boletos presionados que no estas disponibles.
     * Cuenta el número de boletos presionados.
     * Setea los valores del boleto en el Frame de compra.
     * @param evt 
     */
    private void jButtonComprarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButtonComprarMouseClicked
        // TODO add your handling code here:
        if(((logic.Rifa)((logic.Categoria)categoria.getObject(listaCat.getIdCat())).getRifas().getObject(listaRifa.getIdRifa(listaCat.getIdCat()))).getNroGanador()!=-1){
            JOptionPane.showMessageDialog(this, "Error: Esta rifa ya se sorteó");
            return;
        }
        boolean flag=true;
        int nro=0;
        windowBotonCompra = new JFrameCompra(this);
        for(int i=0;i<this.panelBoletos.getBotones().length;i++){
            if((this.panelBoletos.getBotones())[i].isPressed()){
                if((this.panelBoletos.getBotones())[i].getStatus()!=1){
                    flag=false;
                }
                nro++;
            }
        }        
        if(nro!=0){
            if(flag){
                windowBotonCompra.setNroBoleto(nro+"");
                windowBotonCompra.setPrecioBoleto(this.panelInfoRifa.getValorTicket());
                windowBotonCompra.setTotalBoleto((Double.parseDouble(this.panelInfoRifa.getValorTicket())*nro)+"");
                windowBotonCompra.setVisible(true);
            }else{
                JOptionPane.showMessageDialog(this, "Error: Uno o varios boletos no disponibles.");
            }  
        }else{
            JOptionPane.showMessageDialog(this, "Error: Seleccione un boleto.");
        }

    }//GEN-LAST:event_jButtonComprarMouseClicked

    /**
     * MouseClicked del boton pagar.
     * Verifica si la rifa ya fue sorteada.
     * Crea el frame de pago.
     * Recorre la table de boletos, tomando en consideracion aquello presionados que estan en estado reservado.
     * Cuenta el número de boletos.
     * Si hay boletos reservados setea los datos de los mismos en el Frame de pago.
     * En caso contrario envia mensajes de error al usuario.
     * @param evt 
     */
    private void botonPagarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_botonPagarMouseClicked
        // TODO add your handling code here:
        if(((logic.Rifa)((logic.Categoria)categoria.getObject(listaCat.getIdCat())).getRifas().getObject(listaRifa.getIdRifa(listaCat.getIdCat()))).getNroGanador()!=-1){
            JOptionPane.showMessageDialog(this, "Error: Esta rifa ya se sorteó.");
            return;
        }        
        boolean flag=true;
        int nro=0;
        windowBotonPagar = new JFramePago(this);
        for(int i=0;i<this.panelBoletos.getBotones().length;i++){
            if((this.panelBoletos.getBotones())[i].isPressed()){
                if((this.panelBoletos.getBotones())[i].getStatus()!=2){
                    flag=false;
                }
                nro++;
            }
        }        
        if(nro!=0){
            if(flag){
                windowBotonPagar.setNroBoleto(nro+"");
                windowBotonPagar.setPrecioBoleto(this.panelInfoRifa.getValorTicket());
                windowBotonPagar.setTotalBoleto((Double.parseDouble(this.panelInfoRifa.getValorTicket())*nro)+"");
                windowBotonPagar.setVisible(true);
            }else{
                JOptionPane.showMessageDialog(this, "Error: Uno o varios boletos no reservados.");
            }  
        }else{
            JOptionPane.showMessageDialog(this, "Error: Seleccione un boleto.");
        }        
    }//GEN-LAST:event_botonPagarMouseClicked

    /**
     * Al presionar el boton de borrar categoria, si existen entonces crea y muestra el Frame borrar categoria.
     * en caso contrario muestra un mensaje de error.
     * @param evt 
     */
    private void jMenuItemBorrarCatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemBorrarCatActionPerformed
        // TODO add your handling code here:
        
        if(listaCat.getNroCategorias()>0){
            windowBorrarCat = new JFrameBorrarCat(this);
            windowBorrarCat.setVisible(true);
        }else{
            JOptionPane.showMessageDialog(this, "Error: No hay categorías creadas.");
        }
    }//GEN-LAST:event_jMenuItemBorrarCatActionPerformed
 
    /**
     * Al presionar el boton de borrar rifa, si existen categorias, crea y se visualiza el JFrame.
     * En caso contrario envia un mensaje de error.
     * @param evt 
     */
    private void botonBorrarRifaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonBorrarRifaActionPerformed
        // TODO add your handling code here:
        if (listaCat.getNroCategorias()>0){
            windowBorrarRifa = new JFrameBorrarRifa(this);
            windowBorrarRifa.setVisible(true);  
        }else{
            JOptionPane.showMessageDialog(this, "Error: No hay rifas creadas.");
        }
         
    }//GEN-LAST:event_botonBorrarRifaActionPerformed

    /**
     * Al presionar el boton de realizar sorteo,
     * Se genera un nuevo Frame de sorteo y se hace visible.
     * @param evt 
     */
    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        // TODO add your handling code here:
        windowSorteo = new JFrameSorteo(this);
        windowSorteo.setLocation(280, 200);
        windowSorteo.setVisible(true);
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    /**
     * Al presionar el boton de opciones de guardado,
     * Crea un nuevo Frame del tipo JFrameGuardado y lo hace visible.
     * @param evt 
     */
    private void jMenuItemGuardadoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemGuardadoActionPerformed
        // TODO add your handling code here:
        windowGuardar = new JFrameGuardado(this);
        windowGuardar.setLocation(280, 230);
        windowGuardar.setVisible(true);
        
    }//GEN-LAST:event_jMenuItemGuardadoActionPerformed

    /**
     * Al presionar el boton de copiar cliente,
     * crea una variable de tipo rifa,
     * Recorre el panel de boletos en busqueda de aquellos boletos que esten presionados y a su vez,
     * esten comprados o reservados; asigna el ID del cliente y cuenta el numero de boletos no disponibles
     * Además cuenta el número de boletos presionados, en caso de existir boletos no disponibles setea los datos respectivos.
     * @param evt 
     */
    private void copiarClienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copiarClienteActionPerformed
        // TODO add your handling code here:
        logic.Rifa rifa = (logic.Rifa)((logic.Categoria)categoria.getObject(this.listaCat.getIdCat())).getRifas().getObject(this.listaRifa.getIdRifa(this.listaCat.getIdCat()));
        int nroPresionado = 0;
        int nroND = 0;
        int idC = -1;
        
        if(rifa.getNroGanador()!=-1){
            JOptionPane.showMessageDialog(this, "Error: Esta rifa ya se sorteó.");
            return;
        }  
        for(int i = 0; (i<this.panelBoletos.getBotones().length) ; i++){
            if (this.panelBoletos.getBotones()[i].isPressed() == true){
                if ((this.panelBoletos.getBotones()[i].getStatus()==2) || (this.panelBoletos.getBotones()[i].getStatus()==3)){
                   idC = cliente.getObject(rifa.getTicket(i).getIdComprador()).getId();
                   nroND++;
                }
            nroPresionado++;    
            }
        }
        
        if (nroND == 0){
            JOptionPane.showMessageDialog(this, "Error: Debe seleccionar 1 boleto comprado/reservado.");
        }else if (nroND > 1){
            JOptionPane.showMessageDialog(this, "Error: No puede seleccionar más de 1 boleto comprado/reservado.");
        }else{
            windowBotonCompra = new JFrameCompra(this, idC);
            windowBotonCompra.setNroBoleto(nroPresionado-1+"");
            windowBotonCompra.setPrecioBoleto(this.panelInfoRifa.getValorTicket());
            windowBotonCompra.setTotalBoleto((Double.parseDouble(this.panelInfoRifa.getValorTicket())*(nroPresionado-1))+"");            
            windowBotonCompra.setVisible(true);
        }
    }//GEN-LAST:event_copiarClienteActionPerformed

    /**
     * @param args the command line arguments
     */
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem botonBorrarRifa;
    private javax.swing.JButton botonPagar;
    private javax.swing.JButton copiarCliente;
    private javax.swing.JButton jButtonComprar;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenu jMenu4;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItemAñadirCategoria;
    private javax.swing.JMenuItem jMenuItemAñadirRifa;
    private javax.swing.JMenuItem jMenuItemBorrarCat;
    private javax.swing.JMenuItem jMenuItemGuardado;
    // End of variables declaration//GEN-END:variables
}
